package com.ideaaedi.springcloud.jd.user.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ideaaedi.springcloud.jd.commonds.entity.PageInfo;
import com.ideaaedi.springcloud.jd.commonds.entity.user.po.SysTenantPO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.SysTenantListReqVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.resp.SysTenantDetailRespVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.resp.SysTenantListRespVO;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 系统-业务租户 服务类
 * <p>
 * 从系统设计上来讲，每一个部门都是一个租户；但从业务上来看，只有业务租户，该业务租户下的部门只是它的部门，而不是新的租户
 * <p>
 * 租户tenant是实际概念(其值对应各部门的path)， 而业务租户bizTenant是抽象概念（系统设计上将某层级的tenant作为业务租户，该层级及该层级下的tenant都属于该bizTenant）
 * <p>
 * <pre>
 *  tenant与bizTenant的关系：
 *
 *                                     tenant1
 *                               /                \
 *                     tenant2 (bizTenantA)   tenant3 (bizTenantB)
 *                 /           \                /           \
 *          tenant4         tenant5       tenant6         tenant7
 *
 * 在本系统中，一个tenant是可能属于bizTenant的，如：tenant2、tenant4、tenant5就属于bizTenantA。当然同时tenant2就是bizTenantA
 *
 * 在本系统中，一个tenant是可能不属于bizTenant的（如：tenant1），这种租户称之为系统租户。相关账号、数据等都是对内的。
 * </pre>
 *
 * @author <font size = "20" color = "#3CAA3C"><a href="https://gitee.com/JustryDeng">JustryDeng</a></font> <img src="https://gitee.com/JustryDeng/shared-files/raw/master/JustryDeng/avatar.jpg" />
 * @since 2021.0.5.B
 */
public interface SysTenantService extends IService<SysTenantPO> {
    
    /**
     * 创建部门对应作为租户
     *
     * @param deptIds 部门id集合
     *
     * @return 新增的数据集
     */
    @NonNull
    List<SysTenantPO> createIfMiss(@NonNull Collection<Integer> deptIds);
    
    /**
     * 删除部门对应的租户
     *
     * @param deptIds 部门id集合
     *
     * @return 删除的数据集
     */
    @NonNull
    List<SysTenantPO> removeIfExist(@NonNull Collection<Integer> deptIds);
    
    /**
     * 查详情
     *
     * @param id 要查询数据的id
     *
     * @return 数据详情
     */
    @Nullable
    SysTenantDetailRespVO detail(Long id);

    /**
     * 查列表
     *
     * @param req 参数
     *
     * @return 数据列表
     */
    PageInfo<SysTenantListRespVO> list(SysTenantListReqVO req);
    
    /**
     * 租户是否属于业务租户
     *
     * @param tenant 租户值
     *
     * @return 是否属于业务租户（true-属于业务租户；false-系统租户）
     */
    boolean belongBizTenant(@NonNull String tenant);
    
    /**
     * 获取租户-租户名映射关系
     * <p>
     * 注：若name为null，name返回的map中都不会包含对应的tenant键
     * </p>
     *
     * @param tenantColle 要查询的租户
     * @param onlyBizTenant true-只查询tenantColle中属于业务租户的租户; false-查询tenantColle中的全量租户
     *
     * @return key-租户值；value-租户名
     */
    @NonNull
    Map<String, String> mappingTenantName(@Nullable Collection<String> tenantColle, boolean onlyBizTenant);
}
